<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>组件访问-父访问子-children-refs</title>
</head>
<body>
<div id="app">
  <cpn></cpn>
  <cpn></cpn>
  <cpn ref="three"></cpn>
  <button @click="btnClick">按钮</button>
</div>

<template id="cpn">
  <div>
    <h2>这里是子组件</h2>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>

  const cpn = {
    template: '#cpn',
    data() {
      return {
        name: '张三'
      }
    },
    methods: {
      showMessage() {
        console.log('这是子组件的方法');
      }
    }
  }

  const app = new Vue({
    el: '#app',
    data: {
      message: 'Hello Vue'
    },
    components: {
      cpn: cpn
    },
    methods: {
      btnClick(){
        // 1、$children：是通过数组形式的访问（默认获取到的是一个数组，数组包含所有的子组件信息）
        // 比如父组件里有三个子组件<cpn>0</cpn>、<cpn1</cpn>、<cpn>2</cpn>，
        // 那就是通过$children[0]，$children[1]，$children[2]的顺序访问
        // 缺点：如果在这三个子组件中间添加一个子组件，如：<cpn>0</cpn>、<cpn>1</cpn>、<my-cpn></my-cpn>、<cpn>2</cpn>，
        //      这时候，$children[2]所访问到的子组件就会由<cpn>2</cpn> 变成 <my-cpn></my-cpn>
        console.log(this.$children);
        console.log(this.$children[0].name);
        this.$children[0].showMessage();

        // 2、$refs：是对象的形式获取子组件信息（在不指定的情况下，获取到的对象为空）
        // 用法：通过指定子组件的ref，获取子组件的对象信息
        console.log(this.$refs);
        console.log(this.$refs.three);
        console.log(this.$refs.three.name);
        this.$refs.three.showMessage();
      }
    }
  });
</script>
</body>
</html>
